home *** CD-ROM | disk | FTP | other *** search
/ Maximum CD 2000 March / maximum-cd-2000-03.iso / Quake3 Game Source / Q3AGameSource.exe / Main / g_session.c < prev    next >
Encoding:
C/C++ Source or Header  |  2000-01-18  |  3.5 KB  |  162 lines

  1. // Copyright (C) 1999-2000 Id Software, Inc.
  2. //
  3. #include "g_local.h"
  4.  
  5.  
  6. /*
  7. =======================================================================
  8.  
  9.   SESSION DATA
  10.  
  11. Session data is the only data that stays persistant across level loads
  12. and tournament restarts.
  13. =======================================================================
  14. */
  15.  
  16. /*
  17. ================
  18. G_WriteClientSessionData
  19.  
  20. Called on game shutdown
  21. ================
  22. */
  23. void G_WriteClientSessionData( gclient_t *client ) {
  24.     const char    *s;
  25.     const char    *var;
  26.  
  27.     s = va("%i %i %i %i %i %i", 
  28.         client->sess.sessionTeam,
  29.         client->sess.spectatorTime,
  30.         client->sess.spectatorState,
  31.         client->sess.spectatorClient,
  32.         client->sess.wins,
  33.         client->sess.losses
  34.         );
  35.  
  36.     var = va( "session%i", client - level.clients );
  37.  
  38.     trap_Cvar_Set( var, s );
  39. }
  40.  
  41. /*
  42. ================
  43. G_ReadSessionData
  44.  
  45. Called on a reconnect
  46. ================
  47. */
  48. void G_ReadSessionData( gclient_t *client ) {
  49.     char    s[MAX_STRING_CHARS];
  50.     const char    *var;
  51.  
  52.     var = va( "session%i", client - level.clients );
  53.     trap_Cvar_VariableStringBuffer( var, s, sizeof(s) );
  54.  
  55.     sscanf( s, "%i %i %i %i %i %i", 
  56.         &client->sess.sessionTeam,
  57.         &client->sess.spectatorTime,
  58.         &client->sess.spectatorState,
  59.         &client->sess.spectatorClient,
  60.         &client->sess.wins,
  61.         &client->sess.losses
  62.         );
  63. }
  64.  
  65.  
  66. /*
  67. ================
  68. G_InitSessionData
  69.  
  70. Called on a first-time connect
  71. ================
  72. */
  73. void G_InitSessionData( gclient_t *client, char *userinfo ) {
  74.     clientSession_t    *sess;
  75.     const char        *value;
  76.  
  77.     sess = &client->sess;
  78.  
  79.     // initial team determination
  80.     if ( g_gametype.integer >= GT_TEAM ) {
  81.         if ( g_teamAutoJoin.integer ) {
  82.             sess->sessionTeam = PickTeam( -1 );
  83.             BroadcastTeamChange( client, -1 );
  84.         } else {
  85.             // always spawn as spectator in team games
  86.             sess->sessionTeam = TEAM_SPECTATOR;    
  87.         }
  88.     } else {
  89.         value = Info_ValueForKey( userinfo, "team" );
  90.         if ( value[0] == 's' ) {
  91.             // a willing spectator, not a waiting-in-line
  92.             sess->sessionTeam = TEAM_SPECTATOR;
  93.         } else {
  94.             switch ( g_gametype.integer ) {
  95.             default:
  96.             case GT_FFA:
  97.             case GT_SINGLE_PLAYER:
  98.                 if ( g_maxGameClients.integer > 0 && 
  99.                     level.numNonSpectatorClients >= g_maxGameClients.integer ) {
  100.                     sess->sessionTeam = TEAM_SPECTATOR;
  101.                 } else {
  102.                     sess->sessionTeam = TEAM_FREE;
  103.                 }
  104.                 break;
  105.             case GT_TOURNAMENT:
  106.                 // if the game is full, go into a waiting mode
  107.                 if ( level.numNonSpectatorClients >= 2 ) {
  108.                     sess->sessionTeam = TEAM_SPECTATOR;
  109.                 } else {
  110.                     sess->sessionTeam = TEAM_FREE;
  111.                 }
  112.                 break;
  113.             }
  114.         }
  115.     }
  116.  
  117.     sess->spectatorState = SPECTATOR_FREE;
  118.     sess->spectatorTime = level.time;
  119.  
  120.     G_WriteClientSessionData( client );
  121. }
  122.  
  123.  
  124. /*
  125. ==================
  126. G_InitWorldSession
  127.  
  128. ==================
  129. */
  130. void G_InitWorldSession( void ) {
  131.     char    s[MAX_STRING_CHARS];
  132.     int            gt;
  133.  
  134.     trap_Cvar_VariableStringBuffer( "session", s, sizeof(s) );
  135.     gt = atoi( s );
  136.     
  137.     // if the gametype changed since the last session, don't use any
  138.     // client sessions
  139.     if ( g_gametype.integer != gt ) {
  140.         level.newSession = qtrue;
  141.         G_Printf( "Gametype changed, clearing session data.\n" );
  142.     }
  143. }
  144.  
  145. /*
  146. ==================
  147. G_WriteSessionData
  148.  
  149. ==================
  150. */
  151. void G_WriteSessionData( void ) {
  152.     int        i;
  153.  
  154.     trap_Cvar_Set( "session", va("%i", g_gametype.integer) );
  155.  
  156.     for ( i = 0 ; i < level.maxclients ; i++ ) {
  157.         if ( level.clients[i].pers.connected == CON_CONNECTED ) {
  158.             G_WriteClientSessionData( &level.clients[i] );
  159.         }
  160.     }
  161. }
  162.